/*******************************************************************************
*                                 AWorks
*                       ----------------------------
*                       innovating embedded platform
*
* Copyright (c) 2001-present Guangzhou ZHIYUAN Electronics Co., Ltd.
* ALL rights reserved.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
*
* The License of this software follows LGPL v2.1, See the LICENSE for more details:
* https://opensource.org/licenses/LGPL-2.1
*
* Contact information:
* web site:    http://www.zlg.cn/
*******************************************************************************/
#ifndef HPM_BOOT_HEADER_H
#define HPM_BOOT_HEADER_H

#include <stdio.h>
#include <stdint.h>

#define HPM_BOOTHEADER_TAG (0xBFU)
#define HPM_BOOTHEADER_MAX_FW_COUNT (2U)

#ifndef HPM_BOOT_FW_COUNT
#define HPM_BOOT_FW_COUNT 1
#endif

#if HPM_BOOT_FW_COUNT < 1
#error "HPM_BOOT_FW_COUNT can't be less than 1"
#endif

typedef struct {
    uint32_t offset;            /* 0x0: offset to boot_header start */
    uint32_t size;              /* 0x4: size in bytes */
    uint32_t flags;             /* 0x8: [3:0] fw type: */
                                /*         0 - executable */
                                /*         1 - cmd container */
                                /*      [11:8] - hash type */
                                /*         0 - none */
                                /*         1 - sha256 */
                                /*         2 - sm3 */
    uint32_t reserved0;         /* 0xC */
    uint32_t load_addr;         /* 0x10: load address */
    uint32_t reserved1;         /* 0x14 */
    uint32_t entry_point;       /* 0x18: application entry */
    uint32_t reserved2;         /* 0x1C */
    uint8_t  hash[64];          /* 0x20: hash value */
    uint8_t  iv[32];            /* 0x60: initial vector */
} fw_info_table_t;

typedef struct {
    uint8_t  tag;               /* 0x0: must be '0xbf' */
    uint8_t  version;           /* 0x1: header version */
    uint16_t length;            /* 0x2: header length, max 8KB */
    uint32_t flags;             /* 0x4: [3:0] SRK set */
                                /*      [7:4] SRK index */
                                /*      [15:8] SRK_REVOKE_MASK */
                                /*      [19:16] Signature Type */
                                /*        1: ECDSA */
                                /*        2: SM2 */
    uint16_t sw_version;        /* 0x8: software version */
    uint8_t  fuse_version;      /* 0xA: fuse version */
    uint8_t  fw_count;          /* 0xB: number of fw */
    uint16_t dc_block_offset;   /* 0xC: device config block offset*/
    uint16_t sig_block_offset;  /* 0xE: signature block offset */
    /*
     * fw_info_table_t fw_info[HPM_BOOT_FW_COUNT]; [> 0x10: fw table <]
     * uint32_t dc_info[];         [> <]
     */
} boot_header_t;

#endif /* HPM_BOOT_HEADER_H */
